package cn.jsj.dao;

import java.util.LinkedList;
import java.util.List;
import java.util.ListIterator;

import cn.jsj.object.FrontFixedMoney;
import cn.jsj.pojo.TblFixedAssets;

/**
 * 固定资产处理类
 * @author LI
 *
 */
public class TblFixedAssetsDAO  {

	/**
	 * 获得固定资产信息条数
	 * @return：固定资产信息总条数
	 */
	public int getFixedAssetNumb(){
		// 取得session对象
		org.hibernate.Session session = HBUtils.getSession();
		// 新建事务对象
		org.hibernate.Transaction tx = session.beginTransaction();
		// 开始事务
		tx.begin();
		String hql="select count(*) from TblFixedAssets";
	    List result=session.createQuery(hql)
		.list();
		// 提交事务
		tx.commit();
		session.close();
		//获得结果的迭代器
		 ListIterator iterator = result.listIterator();
		 Long rows =(Long)iterator.next();
		 return Integer.parseInt(rows.toString());
	}


	/**
	 * 获得某个页面的固定资产信息
	 * @param startNumb：从第几条开始
	 * @param totalNumb：总共几条
	 * @return：固定资产信息队列
	 */
	public java.util.List<TblFixedAssets> getWageInfo(int startNumb,int totalNumb){
		// 取得session对象
		org.hibernate.Session session = HBUtils.getSession();
		// 新建事务对象
		org.hibernate.Transaction tx = session.beginTransaction();
		// 开始事务
		tx.begin();
		List result=session.createCriteria(TblFixedAssets.class)
		.addOrder(org.hibernate.criterion.Order.desc("buyTime"))
		.setFirstResult(startNumb)
		.setMaxResults(totalNumb)
		.list();
		// 提交事务
		tx.commit();
		session.close();
		return result;
	}


	/**
	 * 获得符合条件固定资产信息条数
	 * @param sfap:参数信息对象
	 * @return：固定资产信息总条数
	 */
	public int getSearchFixedAssetNumb(cn.jsj.bgtodb.SearchFixedAssetProperty sfap){
		// 取得session对象
		org.hibernate.Session session = HBUtils.getSession();
		// 新建事务对象
		org.hibernate.Transaction tx = session.beginTransaction();
		// 开始事务
		tx.begin();
		//结果集
		List result=new LinkedList();
		//如果输入时间为NULL
		if(sfap.getSBuyTime().length()==0){
		String hql="select count(*) from TblFixedAssets t where t.goodsName=?";
	    result=session.createQuery(hql)
	    .setString(0, sfap.getAssetName())
		.list();
		}else{
			//如果物品名为NULL
			if(sfap.getAssetName().length()==0){
				String hql="select count(*) from TblFixedAssets t where t.buyTime between ? and ?";
				 result=session.createQuery(hql)
				 		.setDate(0, cn.jsj.utils.TimeDispose.transferDate(sfap.getSBuyTime()))
				 		.setDate(1, cn.jsj.utils.TimeDispose.transferDate(sfap.getEBuyTime()))
						.list();
			}
			else{
				//两条件都不为NULL
				String hql="select count(*) from TblFixedAssets t where t.buyTime between ? and ? and t.goodsName=?";
				 result=session.createQuery(hql)
				 		.setDate(0, cn.jsj.utils.TimeDispose.transferDate(sfap.getSBuyTime()))
				 		.setDate(1, cn.jsj.utils.TimeDispose.transferDate(sfap.getEBuyTime()))
				 		 .setString(2, sfap.getAssetName())
						.list();
			}
		}
		// 提交事务
		tx.commit();
		session.close();
		//获得结果的迭代器
		 ListIterator iterator = result.listIterator();
		 Long rows =(Long)iterator.next();
		 return Integer.parseInt(rows.toString());
	}


	/**
	 * 获得符合条件固定资产信息
	 * @param sfap:参数信息对象
	 * @return：固定资产信息队列
	 */
	public java.util.List<TblFixedAssets> getSearchFixedAsset(cn.jsj.bgtodb.SearchFixedAssetProperty sfap){
		// 取得session对象
		org.hibernate.Session session = HBUtils.getSession();
		// 新建事务对象
		org.hibernate.Transaction tx = session.beginTransaction();
		// 开始事务
		tx.begin();
		//结果集
		List result=new LinkedList();
		//如果输入时间为NULL
		if(sfap.getSBuyTime().length()==0){
		String hql="select t from TblFixedAssets t where t.goodsName=?";
	    result=session.createQuery(hql)
	    .setString(0, sfap.getAssetName())
	    .setFirstResult(sfap.getStartNumb())
	    .setMaxResults(sfap.getTotalNumb())
		.list();
		}else{
			//如果物品名为NULL
			if(sfap.getAssetName().length()==0){
				String hql="select t from TblFixedAssets t where t.buyTime between ? and ?";
				 result=session.createQuery(hql)
				 		.setDate(0, cn.jsj.utils.TimeDispose.transferDate(sfap.getSBuyTime()))
				 		.setDate(1, cn.jsj.utils.TimeDispose.transferDate(sfap.getEBuyTime()))
				 		 .setFirstResult(sfap.getStartNumb())
				 		 .setMaxResults(sfap.getTotalNumb())
						.list();
			}
			else{
				//两条件都不为NULL
				String hql="select t from TblFixedAssets t where t.buyTime between ? and ? and t.goodsName=?";
				 result=session.createQuery(hql)
				 		.setDate(0, cn.jsj.utils.TimeDispose.transferDate(sfap.getSBuyTime()))
				 		.setDate(1, cn.jsj.utils.TimeDispose.transferDate(sfap.getEBuyTime()))
				 		 .setString(2, sfap.getAssetName())
				 		 .setFirstResult(sfap.getStartNumb())
				 		 .setMaxResults(sfap.getTotalNumb())
						.list();
			}
		}
		// 提交事务
		tx.commit();
		session.close();
		 return result;
	}

		/**
		 * 保存固定资产
		 * @param tfa：设备对象
		 * @return：1：保存成功
		 */
		public int saveFixedAsset(cn.jsj.pojo.TblFixedAssets tfa){
			// 取得session对象
			org.hibernate.Session session = HBUtils.getSession();
			// 新建事务对象
			org.hibernate.Transaction tx = session.beginTransaction();
			// 开始事务
			tx.begin();
			session.save(tfa);
			// 提交事务
			tx.commit();
			session.close();
			return 1;
		}


		/**
		 * 获取某种设备的剩余数
		 * @param fixedAssetId：设备ID
		 * @return：设备的剩余数
		 */
		public int getLeftNumber(int fixedAssetId){
			// 取得session对象
			org.hibernate.Session session = HBUtils.getSession();
			// 新建事务对象
			org.hibernate.Transaction tx = session.beginTransaction();
			// 开始事务
			tx.begin();
			String hql="select f.purchaseNumber, f.wipeOutNumber from TblFixedAssets f where f.fixedAssetsId=?";
			List result=session.createQuery(hql)
		 		 .setInteger(0, fixedAssetId)
				.list();
			// 提交事务
			tx.commit();
			session.close();
			//总数
			 ListIterator iterator = result.listIterator();
			    Object[] rows = (Object[]) iterator.next();
			    int totalNumb=Integer.parseInt(rows[0].toString());
			    int wipeNumb=Integer.parseInt(rows[1].toString());
			    //剩余数
			    int leftNumb=totalNumb-wipeNumb;
			return leftNumb;
		}

		/**
		 * 报销设备
		 * @param wap：参数类
		 * @return：1：报销成功
		 */
		public int wipeOutAsset(cn.jsj.bgtodb.WipeAssetProperty wap){
			// 取得session对象
			org.hibernate.Session session = HBUtils.getSession();
			// 新建事务对象
			org.hibernate.Transaction tx = session.beginTransaction();
			// 开始事务
			tx.begin();
			String hql="update TblFixedAssets f set f.wipeOutNumber=f.wipeOutNumber+? where f.fixedAssetsId=?";
			int result=session.createQuery(hql)
			.setInteger(0, wap.getWipeoutNumber())
			.setInteger(1, wap.getFixedAssetId())
			.executeUpdate();
			// 提交事务
			tx.commit();
			session.close();
			return result;
		}

		/**
		 * 获取固定资产资金情况
		 * @return：资金情况对象
		 */
		public FrontFixedMoney getFixedAssetMoney(){
			// 取得session对象
			org.hibernate.Session session = HBUtils.getSession();
			// 新建事务对象
			org.hibernate.Transaction tx = session.beginTransaction();
			// 开始事务
			tx.begin();
			String hql=" select new cn.jsj.object.FrontFixedMoney(sum(f.goodsMoney),sum(f.wipeOutNumber*f.goodsMoney/f.purchaseNumber),sum((f.purchaseNumber-f.wipeOutNumber)*f.goodsMoney/f.purchaseNumber)) from TblFixedAssets f ";
			List result=session.createQuery(hql).list();
			// 提交事务
			tx.commit();
			session.close();
			if(result.size()!=0){
				FrontFixedMoney ffm=(FrontFixedMoney)result.get(0);
				cn.jsj.utils.SysLogger.PrintInfo("      "+ffm.getLeftMoney()+"     "+ffm.getTotalMoney()+"       "+ffm.getWipeoutMoney());
				return ffm;
			}
			return null;
		}


		/**
		 * 更新固定资产
		 * @param tfa：设备对象
		 * @return：1：更新成功
		 */
		public int updateFixedAsset(cn.jsj.pojo.TblFixedAssets tfa){
			// 取得session对象
			org.hibernate.Session session = HBUtils.getSession();
			// 新建事务对象
			org.hibernate.Transaction tx = session.beginTransaction();
			// 开始事务
			tx.begin();
			session.update(tfa);
			// 提交事务
			tx.commit();
			session.close();
			return 1;
		}
}